package core

import (
	"fmt"
	"log"

	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

const (
	ConfigPath string = "./configs"
	ConfigType string = "toml"
)

func NewViper(env string) *viper.Viper {
	v := viper.New()

	// 设置配置文件的名字
	v.SetConfigName("default")

	// 添加配置文件所在的路径,注意在Linux环境下%GOPATH要替换为$GOPATH
	// v.AddConfigPath("$GOPATH/src/")
	v.AddConfigPath(ConfigPath)

	// 设置配置文件类型
	v.SetConfigType(ConfigType)

	if err := v.ReadInConfig(); err != nil {
		log.Printf("读取default配置文件出错 %v\n", err)
	}

	configs := v.AllSettings()
	// 将default中的配置全部以默认配置写入
	for k, v := range configs {
		viper.SetDefault(k, v)
	}

	if env != "" {
		viper.SetConfigName(env)
		viper.AddConfigPath(ConfigPath)
		viper.SetConfigType(ConfigType)
		if err := viper.ReadInConfig(); err != nil {
			log.Printf("读取%s配置文件出错 %v\n", env, err)
		}
	}

	v.OnConfigChange(func(e fsnotify.Event) {
		fmt.Println("config file changed:", e.Name)
		if err := v.Unmarshal(&C); err != nil {
			panic(err)
		}
	})

	// 开始监听
	v.WatchConfig()

	// 绑定到Config
	if err := v.Unmarshal(&C); err != nil {
		panic(err)
	}
	// fmt.Printf("CFG is: %#v\n", Cf)
	// 返回viper.Viper指针
	return v
}
